package hxy.scan.server.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import hxy.scan.server.dao.mapper.BookMapper;
import hxy.scan.server.dao.model.BookModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;


@Slf4j
@RestController
public class BookController {


    @Resource
    BookMapper bookMapper;


    /**
     * 下面这个针对 bookEntity.name 的缓存失效注解基本上没有啥用，因为这个key永远为空，
     * 正确的应该是使list查询的缓存失效,这里就需要定制化的高级操作了
     *
     * @param bookEntity
     * @return
     */
    @CacheEvict(key = "#bookEntity.name", cacheNames = "scan")
    @GetMapping("/book-create")
    public int create(@PathVariable BookModel bookEntity) {

        String name = bookEntity.getName();

        return bookMapper.insert(bookEntity);
    }

    @GetMapping("/book-list")
    public List<BookModel> list() {
        // Ctrl + Alt +V
        List<BookModel> bookModels = bookMapper.selectList(null);
        return bookModels;
    }


    @Cacheable(key = "#name", cacheNames = "scan")
    @GetMapping("/book-one")
    public BookModel one(String name) {
        if (name == null) {
            throw new RuntimeException("参数不可以为空");
        }


        //第一次请求 查询   <key,value>   <name,BookModel>  <String,BookModel>

        // 第一步 查缓存（redis）

        // 没查到

        // 第二步 查询数据库

        // 查到了

        // 第三步 将数据库查询到的数据返回给前端。  并且将数据存储一份到缓存（redis）中

        // 第二次查询

        // 第一步 查询缓存

        // 查到了 返回结果。

        // 数据库与缓存的一致性  如何同步

        // 增加  >  redis删除

        // 删除 > redis删除

        // 修改mysql > redis删除，再插入

        // 查询 > redi数s查询  没有，查询据库。之后又插入到Redis





        QueryWrapper<BookModel> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", name);

        BookModel bookModel = bookMapper.selectOne(queryWrapper);
        log.info("本次从数据库查询结果，{}", bookModel);
        return bookModel;
    }


    @CacheEvict(key = "#bookEntity.name", cacheNames = "scan")
    @GetMapping("/book-update")
    public int update(BookModel bookEntity) {
        // 按照name来更新。 标准正确写法如下、。

        UpdateWrapper<BookModel> updateWrapper = new UpdateWrapper<>();
        // 下面第一个参数是数据库的列名，第二个参数是条件
        updateWrapper.eq("name", bookEntity.getName());

        // 第一个参数是修改的实体，第二个条件是修改来name按照条件，
//        return bookMapper.update(bookEntity, updateWrapper);

        return bookMapper.updateByName(bookEntity);
    }

    @CacheEvict(key = "#name", cacheNames = "scan")
    @GetMapping("/book-delete")
    public int delete(String name) {
        return bookMapper.deleteById(name);
    }

}

